'use strict';

const {Service} = require('ee-core');
const Cross = require('ee-core/cross');
const Log = require('ee-core/log');
const Ps = require('ee-core/ps');
const path = require("path");
const Is = require('ee-core/utils/is');

/**
 * cross（service层为单例）
 * @class
 */
class CrossService extends Service {

    constructor(ctx) {
        super(ctx);
    }

    /**
     * create go service
     * In the default configuration, services can be started with applications.
     * Developers can turn off the configuration and create it manually.
     */
    async createGoServer() {
        // method 1: Use the default Settings
        //const entity = await Cross.run(serviceName);

        // method 2: Use custom configuration
        const serviceName = "go";
        const opt = {
            name: 'goapp',
            cmd: path.join(Ps.getExtraResourcesDir(), 'goapp'),
            directory: Ps.getExtraResourcesDir(),
            args: ['--port=7073'],
            appExit: true,
        }
        const entity = await Cross.run(serviceName, opt);
        Log.info('server name:', entity.name);
        Log.info('server config:', entity.config);
        Log.info('server url:', entity.getUrl());

        return;
    }

    /**
     * create java server
     */
    async createJavaServer() {
        const serviceName = "java";
        const jarPath = path.join(Ps.getExtraResourcesDir(), 'java-app.jar');
        const opt = {
            name: 'javaapp',
            cmd: path.join(Ps.getExtraResourcesDir(), 'jre1.8.0_201/bin/javaw.exe'),
            directory: Ps.getExtraResourcesDir(),
            args: ['-jar', '-server', '-Xms512M', '-Xmx512M', '-Xss512k', `-Dserver.port=8088`, `-Dlogging.file.path=${Ps.getLogDir()}`, `${jarPath}`],
            appExit: false,
        }
        if (Is.macOS()) {
            // Setup Java program
            opt.cmd = path.join(Ps.getExtraResourcesDir(), 'jre1.8.0_201.jre/Contents/Home/bin/java');
        }
        if (Is.linux()) {
            // Setup Java program
        }

        const entity = await Cross.run(serviceName, opt);
        Log.info('server name:', entity.name);
        Log.info('server config:', entity.config);
        Log.info('server url:', Cross.getUrl(entity.name));

        return;
    }

    /**
     * create python service
     * In the default configuration, services can be started with applications.
     * Developers can turn off the configuration and create it manually.
     */
    async createPythonServer() {
        // method 1: Use the default Settings
        //const entity = await Cross.run(serviceName);

        // method 2: Use custom configuration
        const serviceName = "python";
        const opt = {
            name: 'pyapp',
            cmd: path.join(Ps.getExtraResourcesDir(), 'py', 'pyapp'),
            directory: path.join(Ps.getExtraResourcesDir(), 'py'),
            args: ['--port=7074'],
            windowsExtname: true,
            appExit: true,
        }
        const entity = await Cross.run(serviceName, opt);
        Log.info('server name:', entity.name);
        Log.info('server config:', entity.config);
        Log.info('server url:', entity.getUrl());

        return;
    }
}

CrossService.toString = () => '[class CrossService]';
module.exports = CrossService;
